package com.youlai.boot.system.excel;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.youlai.boot.common.excel.ExcelDataHandler;
import com.youlai.boot.common.excel.ExcelHandlerType;
import com.youlai.boot.common.result.ExcelResult;
import com.youlai.boot.system.converter.BigcapConverter;
import com.youlai.boot.system.model.dto.BigcapExcelDTO;
import com.youlai.boot.system.model.entity.Bigcap;
import com.youlai.boot.system.model.query.BigcapQuery;
import com.youlai.boot.system.service.BigcapService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

/**
 * 大盘数据Excel处理器
 *
 * @author Jason
 * @since 2025/5/13
 */
@Component
@ExcelHandlerType("bigcap")
@RequiredArgsConstructor
@Slf4j
public class BigcapExcelHandler implements ExcelDataHandler<BigcapExcelDTO> {

    private final BigcapService bigcapService;
    private final BigcapConverter bigcapConverter;

    @Override
    public Class<BigcapExcelDTO> getEntityClass() {
        return BigcapExcelDTO.class;
    }

    @Override
    public String getFileName() {
        return "大盘数据";
    }

    @Override
    public String getSheetName() {
        return "大盘数据";
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<BigcapExcelDTO> getExportData(Object query) {
        List<Bigcap> bigcapList;
        LambdaQueryWrapper<Bigcap> queryWrapper = new LambdaQueryWrapper<>();
        
        // 指定要查询的字段，排除create_time等不存在的字段
        queryWrapper.select(Bigcap.class, tableFieldInfo -> 
            !"create_time".equals(tableFieldInfo.getColumn()) && 
            !"update_time".equals(tableFieldInfo.getColumn())
        );
        
        if (query instanceof Map) {
            // 处理Map类型的查询参数
            Map<String, Object> params = (Map<String, Object>) query;
            
            // 添加条件，实际项目中可以根据需要添加更多条件
            if (params.containsKey("startDate")) {
                queryWrapper.ge(Bigcap::getDate, params.get("startDate"));
            }
            if (params.containsKey("endDate")) {
                queryWrapper.le(Bigcap::getDate, params.get("endDate"));
            }
        } else if (query instanceof BigcapQuery pageQuery) {
            // 处理BigcapQuery类型的查询参数
            // 这里可以添加其他查询条件，但不使用分页
            // ...
        }
        
        // 获取数据列表（不分页）
        bigcapList = bigcapService.list(queryWrapper);
        
        // 转换为Excel数据模型
        return bigcapConverter.entity2ExcelDTO(bigcapList);
    }

    @Override
    public void handleImportData(List<BigcapExcelDTO> dataList, ExcelResult result) {
        log.info("开始导入数据，共{}条记录", dataList.size());
        
        // 数据校验和处理
        for (BigcapExcelDTO dto : dataList) {
            try {
                // 数据验证
                validateData(dto);
                
                // 转换为实体
                Bigcap bigcap = bigcapConverter.excelDTO2Entity(dto);
                log.debug("转换后的实体数据: {}", bigcap);
                
                // 保存到数据库
                boolean saved = bigcapService.save(bigcap);
                if (saved) {
                    // 成功计数
                    result.setValidCount(result.getValidCount() + 1);
                    log.debug("成功保存第{}条数据", result.getValidCount());
                } else {
                    // 失败计数和错误信息
                    result.setInvalidCount(result.getInvalidCount() + 1);
                    String errorMsg = "第" + (result.getValidCount() + result.getInvalidCount()) + "行: 保存失败";
                    result.addErrorMsg(errorMsg);
                    log.error(errorMsg);
                }
            } catch (Exception e) {
                // 失败计数和错误信息
                result.setInvalidCount(result.getInvalidCount() + 1);
                String errorMsg = "第" + (result.getValidCount() + result.getInvalidCount()) + "行: " + e.getMessage();
                result.addErrorMsg(errorMsg);
                log.error("导入数据错误: {}", errorMsg, e);
            }
        }
        
        // 设置导入结果
        result.setSuccess(result.getInvalidCount() == 0);
        log.info("导入完成，成功{}条，失败{}条", result.getValidCount(), result.getInvalidCount());
    }
    
    /**
     * 数据验证
     *
     * @param dto 数据对象
     */
    private void validateData(BigcapExcelDTO dto) {
        // 日期必填
        if (dto.getDate() == null) {
            throw new IllegalArgumentException("日期不能为空");
        }
        
        // 其他业务验证规则
        // ...
    }
    
    @Override
    public List<BigcapExcelDTO> getTemplateData() {
        // 返回模板数据（空或示例数据）
        return List.of();
    }
} 